package com.lucifer.treasure.enchant.effect;

import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
import net.minecraft.enchantment.EnchantmentEffectContext;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnchantmentLevelBasedValue;
import net.minecraft.enchantment.effect.EnchantmentEntityEffect;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.Vec3d;

public record SteadyEnchantmentEffect(EnchantmentLevelBasedValue strength) implements EnchantmentEntityEffect {
    public static final MapCodec<SteadyEnchantmentEffect> CODEC = RecordCodecBuilder.mapCodec(instance ->
            instance.group(
                    EnchantmentLevelBasedValue.CODEC.fieldOf("strength").forGetter(SteadyEnchantmentEffect::strength)
            ).apply(instance, SteadyEnchantmentEffect::new)
    );

    public static void initialize() {
        // 监听生物受到伤害事件，在击退计算前处理
        ServerLivingEntityEvents.ALLOW_DAMAGE.register((entity, source, amount) -> {
            // 我们不阻止伤害，只是记录有Steady附魔的实体
            return true;
        });

        // 由于Fabric没有直接的击退事件，我们使用伤害后事件来重置速度
        ServerLivingEntityEvents.AFTER_DAMAGE.register((entity, source, baseDamage, damage, blocked) -> {
            if (entity instanceof PlayerEntity player) {
                // 检查玩家是否有Steady附魔
                if (hasSteadyEnchantment(player)) {
                    // 重置水平方向的击退，保留垂直方向（避免影响跳跃）
                    Vec3d velocity = player.getVelocity();
                    // 只重置水平方向的击退效果，保留玩家主动移动和跳跃
                    if (Math.abs(velocity.x) > 0.1 || Math.abs(velocity.z) > 0.1) {
                        // 检查是否是击退造成的（速度变化较大）
                        Vec3d oldVelocity = player.getVelocity();
                        double horizontalSpeed = Math.sqrt(oldVelocity.x * oldVelocity.x + oldVelocity.z * oldVelocity.z);

                        // 如果水平速度超过正常移动速度，可能是击退
                        if (horizontalSpeed > 0.3) {
                            // 保留垂直速度，重置水平速度为较小值
                            player.setVelocity(
                                    oldVelocity.x * 0.1, // 大幅减少水平击退
                                    oldVelocity.y,        // 保留垂直速度
                                    oldVelocity.z * 0.1  // 大幅减少水平击退
                            );
                        }
                    }
                }
            }
        });
    }

    /**
     * 检查玩家是否有Steady附魔
     */
    private static boolean hasSteadyEnchantment(PlayerEntity player) {
        // 检查盔甲
        for (ItemStack stack : player.getArmorItems()) {
            if (getSteadyLevelFromStack(stack) > 0) {
                return true;
            }
        }

        // 检查主手和副手
        if (getSteadyLevelFromStack(player.getMainHandStack()) > 0) {
            return true;
        }
        if (getSteadyLevelFromStack(player.getOffHandStack()) > 0) {
            return true;
        }

        return false;
    }

    /**
     * 从物品栈获取Steady附魔等级
     */
    private static int getSteadyLevelFromStack(ItemStack stack) {
        if (stack.isEmpty()) {
            return 0;
        }

        var enchantments = EnchantmentHelper.getEnchantments(stack);
        return enchantments.getEnchantments().stream()
                .filter(entry -> {
                    if (entry.getKey().isPresent()) {
                        return entry.getKey().get().getValue().toString().equals("lucifer_treasure:steady");
                    }
                    return false;
                })
                .mapToInt(entry -> enchantments.getLevel(entry))
                .max()
                .orElse(0);
    }

    @Override
    public void apply(ServerWorld world, int level, EnchantmentEffectContext context, Entity target, Vec3d pos) {
        // 主要逻辑在事件监听器中处理
        // 这个方法可以用于其他可能的触发方式
        if (target instanceof LivingEntity livingEntity) {
            // 在受到攻击时立即减少击退效果
            Vec3d velocity = livingEntity.getVelocity();
            if (Math.abs(velocity.x) > 0.2 || Math.abs(velocity.z) > 0.2) {
                livingEntity.setVelocity(
                        velocity.x * 0.1,
                        velocity.y,
                        velocity.z * 0.1
                );
            }
        }
    }

    @Override
    public MapCodec<? extends EnchantmentEntityEffect> getCodec() {
        return CODEC;
    }
} 